package his.solr;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;

public class SolrManager {
	String baseURL = "http://localhost:8983/solr/collection1";
	/**
	 * 添加文档数据到solr服务器中
	 * @throws Exception
	 */
	@Test
	public void addContent() throws Exception{
		//创建服务器连接对象
		HttpSolrServer httpSolrServer = new HttpSolrServer(baseURL);
		//创建新的文档对象
		SolrInputDocument solrInputDocument = new SolrInputDocument();
		//设置文档的域
		solrInputDocument.setField("id", "164");
		solrInputDocument.setField("address", "河南 郑州 酒店");
		solrInputDocument.setField("hotelname", "郑州七天连锁酒店");
		//进行添加
		httpSolrServer.add(solrInputDocument);
		//进行手动提交，否则无法进行添加
		httpSolrServer.commit();
	}

	/**
	 * 修改文档内容
	 * 修改其实和添加是一样的，因为只要添加的ID是一样的，那么就会把原来的删除了，然后再添加一个
	 * @throws IOException 
	 * @throws SolrServerException 
	 */
	@Test
	public void updateContent() throws SolrServerException, IOException{
		SolrServer httpSolrServer = new HttpSolrServer(baseURL);
		//创建新的文档对象
		SolrInputDocument solrInputDocument = new SolrInputDocument();
		//设置文档的域
		solrInputDocument.setField("id", "64");
		solrInputDocument.setField("address", "河北 保定 酒店");
		solrInputDocument.setField("hotelname", "保定七天连锁酒店");
		httpSolrServer.add(solrInputDocument);
		//进行手动提交，否则无法进行添加
		httpSolrServer.commit();
	}
	
	/**
	 * 进行删除文档操作
	 * @throws SolrServerException
	 * @throws IOException
	 */
	@Test
	public void deleteContent() throws Exception{
		SolrServer httpSolrServer = new HttpSolrServer(baseURL);
		//删除全部，第一个参数是设置需要删除的数据的域和值，第二个是执行后多久进行删除操作
		//httpSolrServer.deleteByQuery("*:*",1000);
		//删除某个特定域的特定值的数据
		httpSolrServer.deleteByQuery("id:64",1000);
	}
	
	/**
	 * 查询数据（多功能的显示处理）
	 * @throws Exception 
	 */
	@Test
	public void queryContent() throws Exception{
		SolrServer httpSolrServer = new HttpSolrServer(baseURL);
		//创建查询数据对象（便于设置查询条件）
		SolrQuery solrQuery = new SolrQuery();
		//设置查询的域和值，这个在之后的项目中可以用于动态
		//方法一：参数q就代表query查询
		//solrQuery.set("q","name:佘超伟123");
		//方法二：(一般使用该方法)
		solrQuery.setQuery("hotelname:北京");
		//方法三：通过设置默认域
		//solrQuery.set("df", "name");
		//solrQuery.setQuery("佘超伟");
		
		//设置查询过滤条件(可以设置多个，只要域和值有改变就可以了)
		//solrQuery.set("fq", "id:haha123");
		//添加排序方式（可选内容）
		//solrQuery.addSort("需要排序的域",ORDER.asc);//升序
		//solrQuery.addSort("需要排序的域",ORDER.desc);//降序
		//设置分页处理(比如这是设置每次显示5个)
		solrQuery.setStart(0);
		solrQuery.setRows(5);
		//设置只查询显示指定的域和值(第二个参数可以是多个，之间用“逗号”分割)
		//solrQuery.set("fl", "name");
		//设置某域进行高亮显示
		solrQuery.setHighlight(true);
		solrQuery.addHighlightField("hotelname");
		//设置高亮显示格式的前后缀
		solrQuery.setHighlightSimplePre("<span style='color:red'>");
		solrQuery.setHighlightSimplePost("</span>");	
		
		//执行查询，获得查询结果对象
		QueryResponse query = httpSolrServer.query(solrQuery);
		//获取查询的结果集
		SolrDocumentList results = query.getResults();
		//获取高亮显示的查询结果
		//注意点：因为高亮的结果和正常的查询结果是不一样的，所以要进行特别的处理
		Map<String, Map<String, List<String>>> highlighting = query.getHighlighting();
		//遍历结果集
		for (SolrDocument solrDocument : results) {
			String idStr = (String) solrDocument.get("id");
			System.out.println("id----------------" + idStr);
			String nameStr = (String) solrDocument.get("address");
			System.out.println("name----------------" + nameStr);
			System.out.println("===========高亮显示=====================");
			Map<String, List<String>> map = highlighting.get(idStr);
			List<String> list = map.get("hotelname");
			String resultString = list.get(0);
			System.out.println("高亮结果为：-----" + resultString);
		}		
	}

}